#encoding=utf-8

'''
闭包：
1、可以读取函数内部的变量
2、让这些变量的值始终保持在内存中，可以修改内部变量的值
'''

def outer():
    name='tianchuan'
    def inner():
        return name
    return inner() # 返回内部函数

def outer1():
    name='tianchuan'
    def inner():
        return name
    return inner #返回函数地址

def outer_close(a,b):
    def inner_close():
        print('==='+str(a))
        return b
    return inner_close

def create(pos=[0,0]):
    def go(direction,step):
        new_x=pos[0]+direction[0]*step
        new_y=pos[1]+direction[1]*step
        pos[0]=new_x
        pos[1]=new_y
        return pos
    return go



if __name__ == '__main__':
    print(outer())
    print(outer1())
    #一般来说，函数内部的局部变量在这个函数运行完以后，就会被Python的垃圾回收机制从内存中清除掉
    #在函数outer执行退出之后还能继续调用inner函数的，并且在inner函数被调用时，变量name早已不存在了，但是为什么我们调用成功了呢？
    print(outer1()())
    # 传参闭包函数
    obj=outer_close(1,11)
    print(obj())
    print(obj())

    # 创建go实例，方法调用go方法
    player=create()
    print(player(direction=[1,0],step=10))
    print(player(direction=[0,-1],step=20))
    print(player(direction=[-1,0],step=10))
    print(player.__closure__) # 闭包函数都有的属性
    print(player.__closure__[0].cell_contents)# cell 元祖保留所有闭包所依赖的外部变量